`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    18:08:22 08/23/2012 
// Design Name: 
// Module Name:    fms 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////

//maquina de estados para el controlador del semaforo, tiene 8 estados descirtos a continuacion

module fms(reset_sync,sensor_sync,wr,wr_reset,prog_sync,interval,expired,busleds,clk_i)
    ;
	input reset_sync,sensor_sync,wr,prog_sync,expired,clk_i; // definicion de variables de entrada y salida
	output wr_reset;
	output [1:0] interval;
	output [7:0] busleds;
	reg [7:0] busleds;
	reg [1:0] interval;
	reg wr_reset;

	initial begin		// inicializacion de variables 
		wr_reset=0;
		busleds=8'b01111010;
	end
	parameter state1  = 3'b000;	// deficion de los estados de la maquina de estados
   parameter state2  = 3'b001;
   parameter state3  = 3'b010;
   parameter state4  = 3'b011;
   parameter state5  = 3'b100;
   parameter state6  = 3'b101;
   parameter state7  = 3'b110;
   parameter state8  = 3'b111;

   reg [2:0] state = state1;

   always@(posedge clk_i)	// maquina de estados
      if (reset_sync||prog_sync) begin
         state <= state1;
         busleds <= 8'b01111010;
      end
      else
         case (state)
            state1 : begin				//estado 1, calle principal en verde por tbase, pasa al estado 2 si 
					interval <= 2'b00;
               if (expired&&sensor_sync)
                  state <= state2;
               else if (expired&&!sensor_sync)
                  state <= state3;
               else
                  state <= state1;
               busleds <= 8'b01111010;
            end
            state2 : begin				//estado 2, calle principal en verde por text
					interval <= 2'b01;
               if (expired)
                  state <= state4;
               else
                  state <= state2;
				end
            state3 : begin				//estado 3, calle principal en verde por tbase
               interval <= 2'b00;
					if (expired)
                  state <= state4;
               else
                  state <= state3;
				end
            state4 : begin				//estado 4, calle principal en amarillo por tamarillo, pasa al estado 5
               interval <= 2'b10;	//si el paso peatonal esta activado, sino al estado 6
               if (expired&&wr)
                  state <= state5;
               else if (expired&&!wr)
                  state <= state6;
               else
                  state <= state4;
               busleds <= 8'b10111010;
				end
            state5 : begin				//estado 5, paso peatonal en verde por text
               interval <= 2'b01;
					wr_reset<=1;
					if (expired)
                  state <= state6;
               else
                  state <= state5;
					busleds <= 8'b11011001;	
				end
            state6 : begin				//estado 6, calle lateral en verde por tbase, pasa al estado 7 si el 
               interval <= 2'b00;
					wr_reset<=0;
					if (expired&&sensor_sync)
                  state <= state7;
               else if (expired&&!sensor_sync)
                  state <= state8;
               else
                  state <= state6;
               busleds <= 8'b11001110;
				end
            state7 : begin  			//estado 7, calle lateral en verde por text
               interval <= 2'b01;
					if (expired)
                  state <= state8;
               else
                  state <= state7;
				end
            state8 : begin				//estado 8, calle lateral en amarillo por tamarillo, pasa al primer estado
               interval <= 2'b10;	//ya q se termina el ciclo
               if (expired)
                  state <= state1;
               else
                  state <= state8;
               busleds <= 8'b11010110;
				end
         endcase


endmodule
